package factory

import "reflect"

// ==================
// factory-bean_factory: bean工厂
// ==================

// FACTORY_BEAN_PREFIX 常量
const FACTORY_BEAN_PREFIX = "&"

// BeanFactory bean 工厂
type BeanFactory[T any] interface {
	// GetBeanOfName 根据名称获取bean
	GetBeanOfName(string) interface{}
	// GetBeanOfType 根据类型获取bean
	GetBeanOfType(reflect.Type) interface{}
	// GetBeanOfNameAndType 根据名称和类型获取bean
	GetBeanOfNameAndType(string, reflect.Type) interface{}
	// GetBeanProvider 获取bean 提供者
	GetBeanProvider(reflect.Type) ObjectProvider[T]
	// ContainsBean 是否包含bean
	ContainsBean(string) bool
	// IsSingleton 是否是单例
	IsSingleton(string) bool
	// IsPrototype 是否是原型
	IsPrototype(string) bool
	// GetBeanType 获取bean类型
	GetBeanType(string) reflect.Type
}

// ListableBeanFactory 可操作的bean factory
type ListableBeanFactory[T any] interface {
	BeanFactory[T]

	// ContainsBeanDefinition 判断存在bean定义是否存在
	ContainsBeanDefinition(string) bool

	// GetBeanDefinitionCount 获取bean定义数量
	GetBeanDefinitionCount() int

	// GetBeanDefinitionNames 获取bean定义名称
	GetBeanDefinitionNames() []string
}

type defaultBeanFactory struct {
	beans map[string]interface{}
}

type ObjectFactory[T any] interface {
	// GetObject 获取对象
	GetObject() T
}

// ObjectProvider 对象提供者
type ObjectProvider[T any] interface {
	ObjectFactory[T]
	// GetObjectOfArgs 获取对象
	GetObjectOfArgs(args ...interface{}) T
	// GetIfAvailable 获取可用对象，如果可用
	GetIfAvailable() T
}

// BeanProvider 提供者
type BeanProvider[T any] interface {
	ObjectProvider[T]
}
